//package org.hxyjs.rabbitmq;
//
//import com.rabbitmq.client.Channel;
//import org.hxyjs.utils.MailMessageUtils;
//import org.hxyjs.vo.MailUser;
//import org.hxyjs.service.MailSendService;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.amqp.core.*;
//import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
//import org.springframework.amqp.rabbit.connection.ConnectionFactory;
//import org.springframework.amqp.rabbit.listener.MessageListenerContainer;
//import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
//import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
//import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
//import org.springframework.amqp.support.ConsumerTagStrategy;
//import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
//import org.springframework.amqp.support.converter.MessageConverter;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//import java.io.IOException;
//import java.io.UnsupportedEncodingException;
//import java.util.HashMap;
//import java.util.Map;
//
//@Component
//public class RabbitMQConsumerConfig {
//    static String QUEUENAME = "family.mail";
//    static String EXCHANGENAME = "lg.mail";
//    Logger log = LoggerFactory.getLogger(RabbitMQConsumerConfig.class);
//    @Autowired
//    private MailSendService mailSendService;
//    //交换机
//    @Bean
//    public Exchange exchange() {
//        return new DirectExchange("lg.mail", true, false, new HashMap<>());
//    }
//
//    @Bean
//    public Queue queue() {
//        return new Queue("family.mail", true, false, false, new HashMap<>());
//    }
//
//    @Bean
//    public Binding binding() {
//        return new Binding("family.mail", Binding.DestinationType.QUEUE, "lg.mail", "addUser", new HashMap<>());
//    }
//    @Bean
//    public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(ConnectionFactory connectionFactory, MessageConverter messageConverter){
//        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
//
//        factory.setConnectionFactory(connectionFactory);
//        factory.setMessageConverter(messageConverter);
//        factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
//        return factory;
//    }
//    @Bean
//    public MessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) {
//
//        SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer();
//        messageListenerContainer.setConnectionFactory(connectionFactory);
//
//
//        messageListenerContainer.setQueueNames("family.mail");
//        messageListenerContainer.setMaxConcurrentConsumers(1);
//        messageListenerContainer.setConcurrentConsumers(1);
//        messageListenerContainer.setAcknowledgeMode(AcknowledgeMode.MANUAL);//手动确认
//
//        Map<String, Object> argumentMap = new HashMap();
//        messageListenerContainer.setConsumerArguments(argumentMap);
//        messageListenerContainer.setConsumerTagStrategy(new ConsumerTagStrategy() {
//            @Override
//            public String createConsumerTag(String s) {
//                return "下订单发送邮件";
//            }
//        });
//
//        messageListenerContainer.setMessageListener(new ChannelAwareMessageListener() {
//           //当监听器发现 消息服务器中有消息
//            @Override
//            public void onMessage(Message message, Channel channel) {
//                try {// 如果消息为空直接返回 不处理
//                    if(StringUtils.isEmpty(new String(message.getBody(),"UTF-8"))) {
//                        return;
//                    }
//                    System.out.println(message.getBody()+"------------111-----------");
//                    Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter();
////因为写消息的时候 存放的就是MailUser的序列化对象（包含用户名 邮件地址 和 消息内容），所以反序列化出来的对象就MailUser
//                    System.out.println(((MailUser)jackson2JsonMessageConverter.fromMessage(message)).getMailName());
//                    //Student student = (Student) SerializationUtils.deserialize(message.getBody());//默认序列化器的获取
//                    MailUser mailUser = (MailUser)jackson2JsonMessageConverter.fromMessage(message);//json序列化器的获取
//                    System.out.println(mailUser);
//
//                    //log.info("消费者消费{}",mailUser);
//                    //发送邮件
//                    String   op = mailUser.getOp();
//                    System.out.println("-------222222222----");
//                    System.out.println(op);
//                    String[] mail = MailMessageUtils.getMessage(mailUser,op);
//                    mailSendService.sendMail(mailUser,mail[0],mail[1])
//                    ;//mail数组第一个值是 主题 第二个值邮件内容
//                    //告诉服务器收到这条消息 已经被我消费了 可以在队列删掉 这样以后就不会再发了 否则消息服务器以为这条消息没处理掉 后续还会在发，这个代码的执行其实是有逻辑 可以 超时消费，注册邮件可以超时消费掉消息，还可以用户有一个手动点确认的按钮发送给web服务器让web服务器发确认给消息服务器，也可以如果消费端 和web服务器不在一起 客户让 web服务器存rendis 消费端去问redis中有没有用户消费的确认有 ，再发送确认给消息服务器
//                    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
//
//                    System.out.println("12333333");
//                } catch (UnsupportedEncodingException e) {
//                    e.printStackTrace();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                } catch (IllegalAccessException e) {
//                    e.printStackTrace();
//                } catch (InstantiationException e) {
//                    e.printStackTrace();
//                } catch (ClassNotFoundException e) {
//                    e.printStackTrace();
//                }
//
//            }
//        });
//        return messageListenerContainer;
//    }
//}